package edu.ynu.se.xiecheng.achitectureclass.digitalagriculture.dao;

import edu.ynu.se.xiecheng.achitectureclass.digitalagriculture.entity.DeviceSoilRecordEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.io.Serializable;
import java.util.List;

/**
 * 土壤记录数据访问接口
 * 设计原则体现：
 * 1. 分层架构 - 作为DAO层，专注于数据访问
 * 2. 依赖倒置原则 - 通过接口定义规范，供上层调用
 * 3. 接口隔离原则 - 继承必要的最小接口集
 */
public interface DeviceSoilRecordDAO extends JpaRepository<DeviceSoilRecordEntity, Long>, JpaSpecificationExecutor<DeviceSoilRecordEntity>, Serializable {

    /**
     * 获取最新数据查询方法
     * 设计原则体现：
     * 1. 单一职责原则 - 方法功能单一，只负责查询最新记录
     * 2. 声明式查询 - 使用@Query注解分离SQL查询
     */
    @Query(nativeQuery = true, value = "SELECT * FROM device_soil_record  dsr WHERE dsr.id IN(SELECT MAX(dssr.id) FROM device_soil_record  dssr GROUP BY dssr.name)")
    List<DeviceSoilRecordEntity> getLastData();

    /**
     * 获取指定日期数据
     * 设计原则体现：
     * 1. 参数化查询 - 使用@Param注解实现参数绑定
     * 2. 封装变化 - SQL查询逻辑封装在DAO层
     */
    @Query(nativeQuery = true, value = " SELECT AVG(VALUE) VALUE FROM device_soil_record dsr WHERE DATE(TIME)=:date AND NAME=:name")
    String getTrDat(@Param("date") String date,@Param("name") String name);

    /**
     * 获取周数据
     * 设计原则体现：
     * 1. 职责单一 - 专注于周期数据查询
     * 2. 接口隔离 - 独立的查询方法
     */
    @Query(nativeQuery = true, value = "  SELECT AVG(VALUE) VALUE FROM device_soil_record dsr WHERE TIME > NOW() - INTERVAL 1 WEEK AND  NAME=:name")
    String getZztDat(@Param("name") String name);
}
